package com.me.web.server;

import io.netty.channel.socket.SocketChannel;
import io.netty.handler.codec.http.HttpObjectAggregator;
import io.netty.handler.codec.http.HttpServerCodec;
import io.netty.handler.codec.http.websocketx.WebSocketServerProtocolHandler;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;


/**
 * WebSocketServer 类，继承自 AbstractNettyServer，基于 Netty 框架实现的 WebSocket 服务器类。
 * 它负责从配置文件中获取 WebSocket 服务器的配置信息（主机地址和端口范围）。
 * 5、 WebSocketServer 类，继承自 AbstractNettyServer，基于 Netty 框架实现的 WebSocket 服务器类。
 *
 * @author chenlei
 */
@Slf4j
@Component
public class WebSocketServer extends AbstractNettyServer {


    /**
     * WebSocket 服务器的主机地址
     */
    private String host = "10.10.10.186";


    /**
     * WebSocket 服务器的端口范围，多个端口使用逗号分隔。
     */
    private int port = 8082;


    /**
     * 获取 WebSocket 服务器的主机地址。
     *
     * @return 从配置文件中获取的 WebSocket 服务器的主机地址。
     */
    @Override
    protected String getHost() {
        return host;
    }


    /**
     * 获取 WebSocket 服务器的端口范围。
     *
     * @return 从配置文件中获取的 WebSocket 服务器的端口范围。
     */
    @Override
    protected int getPort() {
        return port;
    }


    /**
     * 初始化 WebSocket 服务器的通道处理器。
     * 方法会在服务器启动时为每个新建立的 SocketChannel 配置处理器链，以处理 WebSocket 通信的各个阶段。
     *
     * @param ch 新建立的 SocketChannel，用于与客户端进行通信。
     */
    @Override
    protected void initChannelHandlers(SocketChannel ch) {
        // 在通道的处理器链中添加 HttpServerCodec，用于处理 HTTP 协议的编解码
        ch.pipeline().addLast(new HttpServerCodec());
        // 添加 HttpObjectAggregator，用于将 HTTP 消息聚合成完整的请求或响应
        ch.pipeline().addLast(new HttpObjectAggregator(65536));
        // 添加 WebSocketServerProtocolHandler，用于处理 WebSocket 的握手、控制帧等
        ch.pipeline().addLast(new WebSocketServerProtocolHandler("/websocket"));
        // 添加自定义的处理器，用于处理 WebSocket 数据
        ch.pipeline().addLast(new WebSocketHandler());
    }
}
